misc-info.c \
object-hierarchy.h \
object-hierarchy.c \
+ object-tree.h \
+ object-tree.c \
prop-editor.h \
prop-editor.c \
prop-list.h \
size-groups.c \
visual.h \
visual.c \
- widget-tree.h \
- widget-tree.c \
window.h \
window.c
menu.ui \
misc-info.ui \
object-hierarchy.ui \
+ object-tree.ui \
prop-list.ui \
resource-list.ui \
signals-list.ui \
style-prop-list.ui \
visual.ui \
- widget-tree.ui \
window.ui
template_headers = $(templates:.ui=.ui.h)
#include <glib/gi18n-lib.h>
#include "gestures.h"
-#include "widget-tree.h"
+#include "object-tree.h"
#include "gtksizegroup.h"
#include "gtkcomboboxtext.h"
enum
{
PROP_0,
- PROP_WIDGET_TREE
+ PROP_OBJECT_TREE
};
struct _GtkInspectorGesturesPrivate
{
GtkSizeGroup *sizegroup;
GObject *object;
- GtkWidget *widget_tree;
+ GtkWidget *object_tree;
};
G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorGestures, gtk_inspector_gestures, GTK_TYPE_BOX)
GObject *gesture;
gesture = G_OBJECT (g_object_get_data (G_OBJECT (row), "gesture"));
- gtk_inspector_widget_tree_select_object (GTK_INSPECTOR_WIDGET_TREE (sl->priv->widget_tree),
+ gtk_inspector_object_tree_select_object (GTK_INSPECTOR_OBJECT_TREE (sl->priv->object_tree),
gesture);
}
switch (param_id)
{
- case PROP_WIDGET_TREE:
- g_value_take_object (value, sl->priv->widget_tree);
+ case PROP_OBJECT_TREE:
+ g_value_take_object (value, sl->priv->object_tree);
break;
default:
switch (param_id)
{
- case PROP_WIDGET_TREE:
- sl->priv->widget_tree = g_value_get_object (value);
+ case PROP_OBJECT_TREE:
+ sl->priv->object_tree = g_value_get_object (value);
break;
default:
object_class->get_property = get_property;
object_class->set_property = set_property;
- g_object_class_install_property (object_class, PROP_WIDGET_TREE,
- g_param_spec_object ("widget-tree", "Widget Tree", "Widget tree",
+ g_object_class_install_property (object_class, PROP_OBJECT_TREE,
+ g_param_spec_object ("object-tree", "Widget Tree", "Widget tree",
GTK_TYPE_WIDGET, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
}
#include "menu.h"
#include "misc-info.h"
#include "object-hierarchy.h"
+#include "object-tree.h"
#include "prop-list.h"
#include "resource-list.h"
#include "resources.h"
#include "size-groups.h"
#include "style-prop-list.h"
#include "visual.h"
-#include "widget-tree.h"
#include "window.h"
void
g_type_ensure (GTK_TYPE_INSPECTOR_MENU);
g_type_ensure (GTK_TYPE_INSPECTOR_MISC_INFO);
g_type_ensure (GTK_TYPE_INSPECTOR_OBJECT_HIERARCHY);
+ g_type_ensure (GTK_TYPE_INSPECTOR_OBJECT_TREE);
g_type_ensure (GTK_TYPE_INSPECTOR_PROP_LIST);
g_type_ensure (GTK_TYPE_INSPECTOR_RESOURCE_LIST);
g_type_ensure (GTK_TYPE_INSPECTOR_SIGNALS_LIST);
g_type_ensure (GTK_TYPE_INSPECTOR_STYLE_PROP_LIST);
g_type_ensure (GTK_TYPE_INSPECTOR_SIZE_GROUPS);
g_type_ensure (GTK_TYPE_INSPECTOR_VISUAL);
- g_type_ensure (GTK_TYPE_INSPECTOR_WIDGET_TREE);
g_type_ensure (GTK_TYPE_INSPECTOR_WINDOW);
}
#include <glib/gi18n-lib.h>
#include "window.h"
-#include "widget-tree.h"
+#include "object-tree.h"
#include "gtkstack.h"
#include "gtkmain.h"
select_widget (GtkInspectorWindow *iw,
GtkWidget *widget)
{
- GtkInspectorWidgetTree *wt = GTK_INSPECTOR_WIDGET_TREE (iw->widget_tree);
+ GtkInspectorObjectTree *wt = GTK_INSPECTOR_OBJECT_TREE (iw->object_tree);
GtkTreeIter iter;
iw->selected_widget = widget;
gtk_stack_set_visible_child_name (GTK_STACK (iw->top_stack), "objects");
- if (!gtk_inspector_widget_tree_find_object (wt, G_OBJECT (widget), &iter))
- gtk_inspector_widget_tree_scan (wt, gtk_widget_get_toplevel (widget));
- gtk_inspector_widget_tree_select_object (wt, G_OBJECT (widget));
+ if (!gtk_inspector_object_tree_find_object (wt, G_OBJECT (widget), &iter))
+ gtk_inspector_object_tree_scan (wt, gtk_widget_get_toplevel (widget));
+ gtk_inspector_object_tree_select_object (wt, G_OBJECT (widget));
}
static void
<file compressed="true">menu.ui</file>
<file compressed="true">misc-info.ui</file>
<file compressed="true">object-hierarchy.ui</file>
+ <file compressed="true">object-tree.ui</file>
<file compressed="true">prop-list.ui</file>
<file compressed="true">style-prop-list.ui</file>
<file compressed="true">resource-list.ui</file>
<file compressed="true">signals-list.ui</file>
<file compressed="true">visual.ui</file>
- <file compressed="true">widget-tree.ui</file>
<file compressed="true">window.ui</file>
<file>logo.png</file>
</gresource>
#include "misc-info.h"
#include "window.h"
-#include "widget-tree.h"
+#include "object-tree.h"
#include "gtktypebuiltins.h"
#include "gtktreeview.h"
#include "gtkframe.h"
struct _GtkInspectorMiscInfoPrivate {
- GtkInspectorWidgetTree *widget_tree;
+ GtkInspectorObjectTree *object_tree;
GObject *object;
enum
{
PROP_0,
- PROP_WIDGET_TREE
+ PROP_OBJECT_TREE
};
G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorMiscInfo, gtk_inspector_misc_info, GTK_TYPE_SCROLLED_WINDOW)
{
GtkTreeIter iter;
- g_object_set_data (G_OBJECT (sl->priv->widget_tree), "next-tab", (gpointer)tab);
- if (gtk_inspector_widget_tree_find_object (sl->priv->widget_tree, object, &iter))
+ g_object_set_data (G_OBJECT (sl->priv->object_tree), "next-tab", (gpointer)tab);
+ if (gtk_inspector_object_tree_find_object (sl->priv->object_tree, object, &iter))
{
- gtk_inspector_widget_tree_select_object (sl->priv->widget_tree, object);
+ gtk_inspector_object_tree_select_object (sl->priv->object_tree, object);
}
else if (GTK_IS_WIDGET (object) &&
- gtk_inspector_widget_tree_find_object (sl->priv->widget_tree, G_OBJECT (gtk_widget_get_parent (GTK_WIDGET (object))), &iter))
+ gtk_inspector_object_tree_find_object (sl->priv->object_tree, G_OBJECT (gtk_widget_get_parent (GTK_WIDGET (object))), &iter))
{
- gtk_inspector_widget_tree_append_object (sl->priv->widget_tree, object, &iter, name);
- gtk_inspector_widget_tree_select_object (sl->priv->widget_tree, object);
+ gtk_inspector_object_tree_append_object (sl->priv->object_tree, object, &iter, name);
+ gtk_inspector_object_tree_select_object (sl->priv->object_tree, object);
}
else
{
switch (param_id)
{
- case PROP_WIDGET_TREE:
- g_value_take_object (value, sl->priv->widget_tree);
+ case PROP_OBJECT_TREE:
+ g_value_take_object (value, sl->priv->object_tree);
break;
default:
switch (param_id)
{
- case PROP_WIDGET_TREE:
- sl->priv->widget_tree = g_value_get_object (value);
+ case PROP_OBJECT_TREE:
+ sl->priv->object_tree = g_value_get_object (value);
break;
default:
object_class->get_property = get_property;
object_class->set_property = set_property;
- g_object_class_install_property (object_class, PROP_WIDGET_TREE,
- g_param_spec_object ("widget-tree", "Widget Tree", "Widget tree",
+ g_object_class_install_property (object_class, PROP_OBJECT_TREE,
+ g_param_spec_object ("object-tree", "Object Tree", "Obect tree",
GTK_TYPE_WIDGET, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/inspector/misc-info.ui");
--- /dev/null
+/*
+ * Copyright (c) 2008-2009 Christian Hammond
+ * Copyright (c) 2008-2009 David Trowbridge
+ * Copyright (c) 2013 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "config.h"
+#include <glib/gi18n-lib.h>
+
+#include <string.h>
+
+#include "object-tree.h"
+#include "prop-list.h"
+
+#include "gtkbuildable.h"
+#include "gtkbutton.h"
+#include "gtkcelllayout.h"
+#include "gtkcomboboxprivate.h"
+#include "gtkiconview.h"
+#include "gtklabel.h"
+#include "gtkmenuitem.h"
+#include "gtksettings.h"
+#include "gtktextview.h"
+#include "gtktreeview.h"
+#include "gtktreeselection.h"
+#include "gtktreestore.h"
+#include "gtktreemodelsort.h"
+#include "gtktreemodelfilter.h"
+#include "gtkwidgetprivate.h"
+
+enum
+{
+ OBJECT,
+ OBJECT_TYPE,
+ OBJECT_NAME,
+ OBJECT_LABEL,
+ OBJECT_ADDRESS,
+ SENSITIVE
+};
+
+
+enum
+{
+ OBJECT_CHANGED,
+ LAST_SIGNAL
+};
+
+
+struct _GtkInspectorObjectTreePrivate
+{
+ GtkTreeView *tree;
+ GtkTreeStore *model;
+ GHashTable *iters;
+ gulong map_hook;
+ gulong unmap_hook;
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorObjectTree, gtk_inspector_object_tree, GTK_TYPE_BOX)
+
+static void
+on_widget_selected (GtkTreeSelection *selection,
+ GtkInspectorObjectTree *wt)
+{
+ GObject *object;
+ GtkTreeIter iter;
+ GtkTreeSelection *sel;
+ GtkTreeModel *model;
+
+ sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (wt->priv->tree));
+ if (gtk_tree_selection_get_selected (sel, &model, &iter))
+ gtk_tree_model_get (model, &iter,
+ OBJECT, &object,
+ -1);
+ else
+ object = NULL;
+
+ g_signal_emit (wt, signals[OBJECT_CHANGED], 0, object);
+}
+
+typedef struct
+{
+ GtkInspectorObjectTree *wt;
+ GObject *object;
+ GtkTreeRowReference *row;
+} ObjectData;
+
+static void
+gtk_object_tree_remove_dead_object (gpointer data, GObject *dead_object)
+{
+ ObjectData *od = data;
+
+ if (gtk_tree_row_reference_valid (od->row))
+ {
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ path = gtk_tree_row_reference_get_path (od->row);
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (od->wt->priv->model), &iter, path);
+ gtk_tree_store_remove (od->wt->priv->model, &iter);
+ gtk_tree_path_free (path);
+ }
+ od->object = NULL;
+ g_hash_table_remove (od->wt->priv->iters, dead_object);
+}
+
+static void
+object_data_free (gpointer data)
+{
+ ObjectData *od = data;
+
+ gtk_tree_row_reference_free (od->row);
+
+ if (od->object)
+ g_object_weak_unref (od->object, gtk_object_tree_remove_dead_object, od);
+
+ g_free (od);
+}
+
+static gboolean
+map_or_unmap (GSignalInvocationHint *ihint,
+ guint n_params,
+ const GValue *params,
+ gpointer data)
+{
+ GtkInspectorObjectTree *wt = data;
+ GtkWidget *widget;
+ GtkTreeIter iter;
+
+ widget = g_value_get_object (params);
+ if (gtk_inspector_object_tree_find_object (wt, G_OBJECT (widget), &iter))
+ gtk_tree_store_set (wt->priv->model, &iter,
+ SENSITIVE, gtk_widget_get_mapped (widget),
+ -1);
+
+ return TRUE;
+}
+
+static void
+gtk_inspector_object_tree_init (GtkInspectorObjectTree *wt)
+{
+ guint signal_id;
+
+ wt->priv = gtk_inspector_object_tree_get_instance_private (wt);
+ wt->priv->iters = g_hash_table_new_full (g_direct_hash,
+ g_direct_equal,
+ NULL,
+ (GDestroyNotify) object_data_free);
+ gtk_widget_init_template (GTK_WIDGET (wt));
+
+ signal_id = g_signal_lookup ("map", GTK_TYPE_WIDGET);
+ wt->priv->map_hook = g_signal_add_emission_hook (signal_id, 0,
+ map_or_unmap, wt, NULL);
+ signal_id = g_signal_lookup ("unmap", GTK_TYPE_WIDGET);
+ wt->priv->unmap_hook = g_signal_add_emission_hook (signal_id, 0,
+ map_or_unmap, wt, NULL);
+
+ gtk_inspector_object_tree_append_object (wt, G_OBJECT (gtk_settings_get_default ()), NULL, NULL);
+}
+
+static void
+gtk_inspector_object_tree_finalize (GObject *object)
+{
+ GtkInspectorObjectTree *wt = GTK_INSPECTOR_OBJECT_TREE (object);
+ guint signal_id;
+
+ g_hash_table_unref (wt->priv->iters);
+
+ signal_id = g_signal_lookup ("map", GTK_TYPE_WIDGET);
+ g_signal_remove_emission_hook (signal_id, wt->priv->map_hook);
+ signal_id = g_signal_lookup ("unmap", GTK_TYPE_WIDGET);
+ g_signal_remove_emission_hook (signal_id, wt->priv->unmap_hook);
+
+ G_OBJECT_CLASS (gtk_inspector_object_tree_parent_class)->finalize (object);
+}
+
+static void
+gtk_inspector_object_tree_class_init (GtkInspectorObjectTreeClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ object_class->finalize = gtk_inspector_object_tree_finalize;
+
+ signals[OBJECT_CHANGED] =
+ g_signal_new ("object-changed",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
+ G_STRUCT_OFFSET (GtkInspectorObjectTreeClass, object_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, G_TYPE_OBJECT);
+
+ gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/inspector/object-tree.ui");
+ gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorObjectTree, model);
+ gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorObjectTree, tree);
+ gtk_widget_class_bind_template_callback (widget_class, on_widget_selected);
+}
+
+typedef struct
+{
+ GtkInspectorObjectTree *wt;
+ GtkTreeIter *iter;
+ GObject *parent;
+} FindAllData;
+
+static void
+child_callback (GtkWidget *widget,
+ gpointer data)
+{
+ FindAllData *d = data;
+
+ gtk_inspector_object_tree_append_object (d->wt, G_OBJECT (widget), d->iter, NULL);
+}
+
+static gboolean
+cell_callback (GtkCellRenderer *renderer,
+ gpointer data)
+{
+ FindAllData *d = data;
+ gpointer cell_layout;
+
+ cell_layout = g_object_get_data (d->parent, "gtk-inspector-cell-layout");
+ g_object_set_data (G_OBJECT (renderer), "gtk-inspector-cell-layout", cell_layout);
+ gtk_inspector_object_tree_append_object (d->wt, G_OBJECT (renderer), d->iter, NULL);
+
+ return FALSE;
+}
+
+static void
+tag_callback (GtkTextTag *tag,
+ gpointer data)
+{
+ FindAllData *d = data;
+ gchar *name;
+
+ g_object_get (tag, "name", &name, NULL);
+ gtk_inspector_object_tree_append_object (d->wt, G_OBJECT (tag), d->iter, name);
+ g_free (name);
+}
+
+void
+gtk_inspector_object_tree_append_object (GtkInspectorObjectTree *wt,
+ GObject *object,
+ GtkTreeIter *parent_iter,
+ const gchar *name)
+{
+ GtkTreeIter iter;
+ GtkTreePath *path;
+ const gchar *class_name;
+ gchar *address;
+ gboolean mapped;
+ ObjectData *od;
+ const gchar *label;
+
+ if (GTK_IS_WIDGET (object))
+ mapped = gtk_widget_get_mapped (GTK_WIDGET (object));
+ else
+ mapped = TRUE;
+
+ class_name = G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (object));
+
+ if (GTK_IS_WIDGET (object))
+ {
+ const gchar *id;
+ id = gtk_widget_get_name (GTK_WIDGET (object));
+ if (name == NULL && id != NULL && g_strcmp0 (id, class_name) != 0)
+ name = id;
+ }
+
+ if (GTK_IS_BUILDABLE (object))
+ {
+ const gchar *id;
+ id = gtk_buildable_get_name (GTK_BUILDABLE (object));
+ if (name == NULL && id != NULL && !g_str_has_prefix (id, "___object_"))
+ name = id;
+ }
+
+ if (name == NULL)
+ name = "";
+
+ if (GTK_IS_LABEL (object))
+ label = gtk_label_get_text (GTK_LABEL (object));
+ else if (GTK_IS_BUTTON (object))
+ label = gtk_button_get_label (GTK_BUTTON (object));
+ else if (GTK_IS_WINDOW (object))
+ label = gtk_window_get_title (GTK_WINDOW (object));
+ else if (GTK_IS_TREE_VIEW_COLUMN (object))
+ label = gtk_tree_view_column_get_title (GTK_TREE_VIEW_COLUMN (object));
+ else
+ label = "";
+
+ address = g_strdup_printf ("%p", object);
+
+ gtk_tree_store_append (wt->priv->model, &iter, parent_iter);
+ gtk_tree_store_set (wt->priv->model, &iter,
+ OBJECT, object,
+ OBJECT_TYPE, class_name,
+ OBJECT_NAME, name,
+ OBJECT_LABEL, label,
+ OBJECT_ADDRESS, address,
+ SENSITIVE, mapped,
+ -1);
+
+ od = g_new0 (ObjectData, 1);
+ od->wt = wt;
+ od->object = object;
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (wt->priv->model), &iter);
+ od->row = gtk_tree_row_reference_new (GTK_TREE_MODEL (wt->priv->model), path);
+ gtk_tree_path_free (path);
+
+ g_hash_table_insert (wt->priv->iters, object, od);
+ g_object_weak_ref (object, gtk_object_tree_remove_dead_object, od);
+
+ g_free (address);
+
+ if (GTK_IS_CONTAINER (object))
+ {
+ FindAllData data;
+
+ data.wt = wt;
+ data.iter = &iter;
+ data.parent = object;
+
+ gtk_container_forall (GTK_CONTAINER (object), child_callback, &data);
+ }
+
+ /* Below are special cases for dependent objects which are not
+ * children in the GtkContainer sense, but which we still want
+ * to show in the tree right away.
+ */
+ if (GTK_IS_TREE_MODEL_SORT (object))
+ {
+ GObject *child = G_OBJECT (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (object)));
+ if (child)
+ gtk_inspector_object_tree_append_object (wt, child, &iter, "model");
+ }
+
+ if (GTK_IS_TREE_MODEL_FILTER (object))
+ {
+ GObject *child = G_OBJECT (gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (object)));
+ if (child)
+ gtk_inspector_object_tree_append_object (wt, child, &iter, "model");
+ }
+
+ if (GTK_IS_MENU_ITEM (object))
+ {
+ GtkWidget *submenu;
+
+ submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (object));
+ if (submenu)
+ gtk_inspector_object_tree_append_object (wt, G_OBJECT (submenu), &iter, "submenu");
+ }
+
+ if (GTK_IS_COMBO_BOX (object))
+ {
+ GtkWidget *popup;
+ GObject *child;
+
+ popup = gtk_combo_box_get_popup (GTK_COMBO_BOX (object));
+ if (popup)
+ gtk_inspector_object_tree_append_object (wt, G_OBJECT (popup), &iter, "popup");
+
+ child = G_OBJECT (gtk_combo_box_get_model (GTK_COMBO_BOX (object)));
+ if (child)
+ gtk_inspector_object_tree_append_object (wt, child, &iter, "model");
+ }
+
+ if (GTK_IS_TREE_VIEW (object))
+ {
+ gint n_columns, i;
+ GObject *child;
+
+ child = G_OBJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (object)));
+ if (child)
+ gtk_inspector_object_tree_append_object (wt, child, &iter, "model");
+
+ child = G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (object)));
+ if (child)
+ gtk_inspector_object_tree_append_object (wt, child, &iter, "selection");
+
+ n_columns = gtk_tree_view_get_n_columns (GTK_TREE_VIEW (object));
+ for (i = 0; i < n_columns; i++)
+ {
+ child = G_OBJECT (gtk_tree_view_get_column (GTK_TREE_VIEW (object), i));
+ gtk_inspector_object_tree_append_object (wt, child, &iter, NULL);
+ }
+ }
+
+ if (GTK_IS_ICON_VIEW (object))
+ {
+ GObject *child;
+
+ child = G_OBJECT (gtk_icon_view_get_model (GTK_ICON_VIEW (object)));
+ if (child)
+ gtk_inspector_object_tree_append_object (wt, child, &iter, "model");
+ }
+
+ if (GTK_IS_CELL_AREA (object))
+ {
+ FindAllData data;
+
+ data.wt = wt;
+ data.iter = &iter;
+ data.parent = object;
+
+ gtk_cell_area_foreach (GTK_CELL_AREA (object), cell_callback, &data);
+ }
+ else if (GTK_IS_CELL_LAYOUT (object))
+ {
+ GtkCellArea *area;
+
+ area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (object));
+ g_object_set_data (G_OBJECT (area), "gtk-inspector-cell-layout", object);
+ gtk_inspector_object_tree_append_object (wt, G_OBJECT (area), &iter, "cell-area");
+ }
+
+ if (GTK_IS_TEXT_VIEW (object))
+ {
+ GtkTextBuffer *buffer;
+
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (object));
+ gtk_inspector_object_tree_append_object (wt, G_OBJECT (buffer), &iter, "buffer");
+ }
+
+ if (GTK_IS_TEXT_BUFFER (object))
+ {
+ GtkTextTagTable *tags;
+
+ tags = gtk_text_buffer_get_tag_table (GTK_TEXT_BUFFER (object));
+ gtk_inspector_object_tree_append_object (wt, G_OBJECT (tags), &iter, "tag-table");
+ }
+
+ if (GTK_IS_TEXT_TAG_TABLE (object))
+ {
+ FindAllData data;
+
+ data.wt = wt;
+ data.iter = &iter;
+ data.parent = object;
+
+ gtk_text_tag_table_foreach (GTK_TEXT_TAG_TABLE (object), tag_callback, &data);
+ }
+
+ if (GTK_IS_WIDGET (object))
+ {
+ struct {
+ GtkPropagationPhase phase;
+ const gchar *name;
+ } phases[] = {
+ { GTK_PHASE_CAPTURE, "capture" },
+ { GTK_PHASE_TARGET, "target" },
+ { GTK_PHASE_BUBBLE, "bubble" },
+ { GTK_PHASE_NONE, "" }
+ };
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (phases); i++)
+ {
+ GList *list, *l;
+
+ list = _gtk_widget_list_controllers (GTK_WIDGET (object), phases[i].phase);
+ for (l = list; l; l = l->next)
+ {
+ GObject *controller = l->data;
+ gtk_inspector_object_tree_append_object (wt, controller, &iter, phases[i].name);
+ }
+ g_list_free (list);
+ }
+ }
+
+}
+
+void
+gtk_inspector_object_tree_scan (GtkInspectorObjectTree *wt,
+ GtkWidget *window)
+{
+ GtkWidget *inspector_win;
+ GList *toplevels, *l;
+
+ gtk_tree_store_clear (wt->priv->model);
+ g_hash_table_remove_all (wt->priv->iters);
+ gtk_inspector_object_tree_append_object (wt, G_OBJECT (gtk_settings_get_default ()), NULL, NULL);
+ if (g_application_get_default ())
+ gtk_inspector_object_tree_append_object (wt, G_OBJECT (g_application_get_default ()), NULL, NULL);
+
+ if (window)
+ gtk_inspector_object_tree_append_object (wt, G_OBJECT (window), NULL, NULL);
+
+ inspector_win = gtk_widget_get_toplevel (GTK_WIDGET (wt));
+ toplevels = gtk_window_list_toplevels ();
+ for (l = toplevels; l; l = l->next)
+ {
+ if (GTK_IS_WINDOW (l->data) &&
+ gtk_window_get_window_type (l->data) == GTK_WINDOW_TOPLEVEL &&
+ l->data != window &&
+ l->data != inspector_win)
+ gtk_inspector_object_tree_append_object (wt, G_OBJECT (l->data), NULL, NULL);
+ }
+ g_list_free (toplevels);
+
+ gtk_tree_view_columns_autosize (GTK_TREE_VIEW (wt->priv->tree));
+}
+
+gboolean
+gtk_inspector_object_tree_find_object (GtkInspectorObjectTree *wt,
+ GObject *object,
+ GtkTreeIter *iter)
+{
+ ObjectData *od;
+
+ od = g_hash_table_lookup (wt->priv->iters, object);
+ if (od && gtk_tree_row_reference_valid (od->row))
+ {
+ GtkTreePath *path;
+
+ path = gtk_tree_row_reference_get_path (od->row);
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (wt->priv->model), iter, path);
+ gtk_tree_path_free (path);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void
+gtk_inspector_object_tree_select_object (GtkInspectorObjectTree *wt,
+ GObject *object)
+{
+ GtkTreeIter iter;
+
+ if (gtk_inspector_object_tree_find_object (wt, object, &iter))
+ {
+ GtkTreePath *path = gtk_tree_model_get_path (GTK_TREE_MODEL (wt->priv->model), &iter);
+ gtk_tree_view_expand_to_path (GTK_TREE_VIEW (wt->priv->tree), path);
+ gtk_tree_selection_select_iter (gtk_tree_view_get_selection (GTK_TREE_VIEW (wt->priv->tree)), &iter);
+ gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (wt->priv->tree), path, NULL, FALSE, 0, 0);
+ }
+}
+
+
+// vim: set et sw=2 ts=2:
--- /dev/null
+/*
+ * Copyright (c) 2008-2009 Christian Hammond
+ * Copyright (c) 2008-2009 David Trowbridge
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef _GTK_INSPECTOR_OBJECT_TREE_H_
+#define _GTK_INSPECTOR_OBJECT_TREE_H_
+
+#include <gtk/gtkbox.h>
+#include <gtk/gtktreemodel.h>
+
+#define GTK_TYPE_INSPECTOR_OBJECT_TREE (gtk_inspector_object_tree_get_type())
+#define GTK_INSPECTOR_OBJECT_TREE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_INSPECTOR_OBJECT_TREE, GtkInspectorObjectTree))
+#define GTK_INSPECTOR_OBJECT_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_INSPECTOR_OBJECT_TREE, GtkInspectorObjectTreeClass))
+#define GTK_INSPECTOR_IS_OBJECT_TREE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_INSPECTOR_OBJECT_TREE))
+#define GTK_INSPECTOR_IS_OBJECT_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_INSPECTOR_OBJECT_TREE))
+#define GTK_INSPECTOR_OBJECT_TREE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_INSPECTOR_OBJECT_TREE, GtkInspectorObjectTreeClass))
+
+
+typedef struct _GtkInspectorObjectTreePrivate GtkInspectorObjectTreePrivate;
+
+typedef struct _GtkInspectorObjectTree
+{
+ GtkBox parent;
+ GtkInspectorObjectTreePrivate *priv;
+} GtkInspectorObjectTree;
+
+typedef struct _GtkInspectorObjectTreeClass
+{
+ GtkBoxClass parent;
+
+ void (*object_changed) (GtkInspectorObjectTree *wt,
+ GObject *object);
+} GtkInspectorObjectTreeClass;
+
+
+G_BEGIN_DECLS
+
+
+GType gtk_inspector_object_tree_get_type (void);
+
+void gtk_inspector_object_tree_scan (GtkInspectorObjectTree *wt,
+ GtkWidget *window);
+void gtk_inspector_object_tree_select_object (GtkInspectorObjectTree *wt,
+ GObject *object);
+void gtk_inspector_object_tree_append_object (GtkInspectorObjectTree *wt,
+ GObject *object,
+ GtkTreeIter *parent_iter,
+ const gchar *name);
+gboolean gtk_inspector_object_tree_find_object (GtkInspectorObjectTree *wt,
+ GObject *object,
+ GtkTreeIter *iter);
+
+G_END_DECLS
+
+
+#endif // _GTK_INSPECTOR_WIDGETTREE_H_
+
+// vim: set et sw=2 ts=2:
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="gtk30">
+ <object class="GtkTreeStore" id="model">
+ <columns>
+ <column type="gpointer"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gboolean"/>
+ </columns>
+ </object>
+ <template class="GtkInspectorObjectTree" parent="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="hscrollbar-policy">automatic</property>
+ <property name="vscrollbar-policy">always</property>
+ <property name="shadow-type">in</property>
+ <property name="width-request">250</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkTreeView" id="tree">
+ <property name="visible">True</property>
+ <property name="model">model</property>
+ <property name="enable-search">True</property>
+ <property name="search-column">2</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection">
+ <signal name="changed" handler="on_widget_selected"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Object</property>
+ <property name="resizable">True</property>
+ <child>
+ <object class="GtkCellRendererText">
+ <property name="scale">0.8</property>
+ </object>
+ <attributes>
+ <attribute name="text">1</attribute>
+ <attribute name="sensitive">5</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Name</property>
+ <property name="resizable">True</property>
+ <child>
+ <object class="GtkCellRendererText">
+ <property name="scale">0.8</property>
+ </object>
+ <attributes>
+ <attribute name="text">2</attribute>
+ <attribute name="sensitive">5</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Label</property>
+ <property name="resizable">True</property>
+ <child>
+ <object class="GtkCellRendererText">
+ <property name="scale">0.8</property>
+ </object>
+ <attributes>
+ <attribute name="text">3</attribute>
+ <attribute name="sensitive">5</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Address</property>
+ <property name="resizable">True</property>
+ <child>
+ <object class="GtkCellRendererText">
+ <property name="scale">0.8</property>
+ <property name="family">monospace</property>
+ </object>
+ <attributes>
+ <attribute name="text">4</attribute>
+ <attribute name="sensitive">5</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
--- /dev/null
+N_("Object");
+N_("Name");
+N_("Label");
+N_("Address");
--- /dev/null
+N_("Object");
+N_("Name");
+N_("Label");
+N_("Address");
#include <glib/gi18n-lib.h>
#include "prop-editor.h"
-#include "widget-tree.h"
+#include "object-tree.h"
#include "gtkactionable.h"
#include "gtkadjustment.h"
#include "prop-list.h"
#include "prop-editor.h"
-#include "widget-tree.h"
+#include "object-tree.h"
#include "gtkcelllayout.h"
#include "gtktreeview.h"
enum
{
PROP_0,
- PROP_WIDGET_TREE,
+ PROP_OBJECT_TREE,
PROP_CHILD_PROPERTIES
};
GtkListStore *model;
GHashTable *prop_iters;
gulong notify_handler_id;
- GtkInspectorWidgetTree *widget_tree;
+ GtkInspectorObjectTree *object_tree;
gboolean child_properties;
GtkTreeViewColumn *attribute_column;
GtkWidget *tree;
switch (param_id)
{
- case PROP_WIDGET_TREE:
- g_value_take_object (value, pl->priv->widget_tree);
+ case PROP_OBJECT_TREE:
+ g_value_take_object (value, pl->priv->object_tree);
break;
case PROP_CHILD_PROPERTIES:
switch (param_id)
{
- case PROP_WIDGET_TREE:
- pl->priv->widget_tree = g_value_get_object (value);
+ case PROP_OBJECT_TREE:
+ pl->priv->object_tree = g_value_get_object (value);
break;
case PROP_CHILD_PROPERTIES:
popover = gtk_widget_get_ancestor (GTK_WIDGET (editor), GTK_TYPE_POPOVER);
gtk_widget_hide (popover);
- g_object_set_data (G_OBJECT (pl->priv->widget_tree), "next-tab", (gpointer)tab);
- if (gtk_inspector_widget_tree_find_object (pl->priv->widget_tree, object, &iter))
+ g_object_set_data (G_OBJECT (pl->priv->object_tree), "next-tab", (gpointer)tab);
+ if (gtk_inspector_object_tree_find_object (pl->priv->object_tree, object, &iter))
{
- gtk_inspector_widget_tree_select_object (pl->priv->widget_tree, object);
+ gtk_inspector_object_tree_select_object (pl->priv->object_tree, object);
}
- else if (gtk_inspector_widget_tree_find_object (pl->priv->widget_tree, pl->priv->object, &iter))
+ else if (gtk_inspector_object_tree_find_object (pl->priv->object_tree, pl->priv->object, &iter))
{
- gtk_inspector_widget_tree_append_object (pl->priv->widget_tree, object, &iter, name);
- gtk_inspector_widget_tree_select_object (pl->priv->widget_tree, object);
+ gtk_inspector_object_tree_append_object (pl->priv->object_tree, object, &iter, name);
+ gtk_inspector_object_tree_select_object (pl->priv->object_tree, object);
}
else
{
object_class->get_property = get_property;
object_class->set_property = set_property;
- g_object_class_install_property (object_class, PROP_WIDGET_TREE,
- g_param_spec_object ("widget-tree", "Widget Tree", "Widget tree",
+ g_object_class_install_property (object_class, PROP_OBJECT_TREE,
+ g_param_spec_object ("object-tree", "Object Tree", "Object tree",
GTK_TYPE_WIDGET, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, PROP_CHILD_PROPERTIES,
g_param_spec_boolean ("child-properties", "Child properties", "Child properties",
+++ /dev/null
-/*
- * Copyright (c) 2008-2009 Christian Hammond
- * Copyright (c) 2008-2009 David Trowbridge
- * Copyright (c) 2013 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include "config.h"
-#include <glib/gi18n-lib.h>
-
-#include <string.h>
-
-#include "widget-tree.h"
-#include "prop-list.h"
-
-#include "gtkbuildable.h"
-#include "gtkbutton.h"
-#include "gtkcelllayout.h"
-#include "gtkcomboboxprivate.h"
-#include "gtkiconview.h"
-#include "gtklabel.h"
-#include "gtkmenuitem.h"
-#include "gtksettings.h"
-#include "gtktextview.h"
-#include "gtktreeview.h"
-#include "gtktreeselection.h"
-#include "gtktreestore.h"
-#include "gtktreemodelsort.h"
-#include "gtktreemodelfilter.h"
-#include "gtkwidgetprivate.h"
-
-enum
-{
- OBJECT,
- OBJECT_TYPE,
- OBJECT_NAME,
- OBJECT_LABEL,
- OBJECT_ADDRESS,
- SENSITIVE
-};
-
-
-enum
-{
- WIDGET_CHANGED,
- LAST_SIGNAL
-};
-
-
-struct _GtkInspectorWidgetTreePrivate
-{
- GtkTreeView *tree;
- GtkTreeStore *model;
- GHashTable *iters;
- gulong map_hook;
- gulong unmap_hook;
-};
-
-static guint widget_tree_signals[LAST_SIGNAL] = { 0 };
-
-G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorWidgetTree, gtk_inspector_widget_tree, GTK_TYPE_BOX)
-
-static void
-on_widget_selected (GtkTreeSelection *selection,
- GtkInspectorWidgetTree *wt)
-{
- GObject *object;
- GtkTreeIter iter;
- GtkTreeSelection *sel;
- GtkTreeModel *model;
-
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (wt->priv->tree));
- if (gtk_tree_selection_get_selected (sel, &model, &iter))
- gtk_tree_model_get (model, &iter,
- OBJECT, &object,
- -1);
- else
- object = NULL;
-
- g_signal_emit (wt, widget_tree_signals[WIDGET_CHANGED], 0, object);
-}
-
-typedef struct
-{
- GtkInspectorWidgetTree *wt;
- GObject *object;
- GtkTreeRowReference *row;
-} ObjectData;
-
-static void
-gtk_widget_tree_remove_dead_object (gpointer data, GObject *dead_object)
-{
- ObjectData *od = data;
-
- if (gtk_tree_row_reference_valid (od->row))
- {
- GtkTreePath *path;
- GtkTreeIter iter;
- path = gtk_tree_row_reference_get_path (od->row);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (od->wt->priv->model), &iter, path);
- gtk_tree_store_remove (od->wt->priv->model, &iter);
- gtk_tree_path_free (path);
- }
- od->object = NULL;
- g_hash_table_remove (od->wt->priv->iters, dead_object);
-}
-
-static void
-object_data_free (gpointer data)
-{
- ObjectData *od = data;
-
- gtk_tree_row_reference_free (od->row);
-
- if (od->object)
- g_object_weak_unref (od->object, gtk_widget_tree_remove_dead_object, od);
-
- g_free (od);
-}
-
-static gboolean
-map_or_unmap (GSignalInvocationHint *ihint,
- guint n_params,
- const GValue *params,
- gpointer data)
-{
- GtkInspectorWidgetTree *wt = data;
- GtkWidget *widget;
- GtkTreeIter iter;
-
- widget = g_value_get_object (params);
- if (gtk_inspector_widget_tree_find_object (wt, G_OBJECT (widget), &iter))
- gtk_tree_store_set (wt->priv->model, &iter,
- SENSITIVE, gtk_widget_get_mapped (widget),
- -1);
-
- return TRUE;
-}
-
-static void
-gtk_inspector_widget_tree_init (GtkInspectorWidgetTree *wt)
-{
- guint signal_id;
-
- wt->priv = gtk_inspector_widget_tree_get_instance_private (wt);
- wt->priv->iters = g_hash_table_new_full (g_direct_hash,
- g_direct_equal,
- NULL,
- (GDestroyNotify) object_data_free);
- gtk_widget_init_template (GTK_WIDGET (wt));
-
- signal_id = g_signal_lookup ("map", GTK_TYPE_WIDGET);
- wt->priv->map_hook = g_signal_add_emission_hook (signal_id, 0,
- map_or_unmap, wt, NULL);
- signal_id = g_signal_lookup ("unmap", GTK_TYPE_WIDGET);
- wt->priv->unmap_hook = g_signal_add_emission_hook (signal_id, 0,
- map_or_unmap, wt, NULL);
-
- gtk_inspector_widget_tree_append_object (wt, G_OBJECT (gtk_settings_get_default ()), NULL, NULL);
-}
-
-static void
-gtk_inspector_widget_tree_finalize (GObject *object)
-{
- GtkInspectorWidgetTree *wt = GTK_INSPECTOR_WIDGET_TREE (object);
- guint signal_id;
-
- g_hash_table_unref (wt->priv->iters);
-
- signal_id = g_signal_lookup ("map", GTK_TYPE_WIDGET);
- g_signal_remove_emission_hook (signal_id, wt->priv->map_hook);
- signal_id = g_signal_lookup ("unmap", GTK_TYPE_WIDGET);
- g_signal_remove_emission_hook (signal_id, wt->priv->unmap_hook);
-
- G_OBJECT_CLASS (gtk_inspector_widget_tree_parent_class)->finalize (object);
-}
-
-static void
-gtk_inspector_widget_tree_class_init (GtkInspectorWidgetTreeClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-
- object_class->finalize = gtk_inspector_widget_tree_finalize;
-
- widget_tree_signals[WIDGET_CHANGED] =
- g_signal_new ("widget-changed",
- G_OBJECT_CLASS_TYPE (klass),
- G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
- G_STRUCT_OFFSET(GtkInspectorWidgetTreeClass, widget_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
-
- gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/inspector/widget-tree.ui");
- gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorWidgetTree, model);
- gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorWidgetTree, tree);
- gtk_widget_class_bind_template_callback (widget_class, on_widget_selected);
-}
-
-typedef struct
-{
- GtkInspectorWidgetTree *wt;
- GtkTreeIter *iter;
- GObject *parent;
-} FindAllData;
-
-static void
-child_callback (GtkWidget *widget,
- gpointer data)
-{
- FindAllData *d = data;
-
- gtk_inspector_widget_tree_append_object (d->wt, G_OBJECT (widget), d->iter, NULL);
-}
-
-static gboolean
-cell_callback (GtkCellRenderer *renderer,
- gpointer data)
-{
- FindAllData *d = data;
- gpointer cell_layout;
-
- cell_layout = g_object_get_data (d->parent, "gtk-inspector-cell-layout");
- g_object_set_data (G_OBJECT (renderer), "gtk-inspector-cell-layout", cell_layout);
- gtk_inspector_widget_tree_append_object (d->wt, G_OBJECT (renderer), d->iter, NULL);
-
- return FALSE;
-}
-
-static void
-tag_callback (GtkTextTag *tag,
- gpointer data)
-{
- FindAllData *d = data;
- gchar *name;
-
- g_object_get (tag, "name", &name, NULL);
- gtk_inspector_widget_tree_append_object (d->wt, G_OBJECT (tag), d->iter, name);
- g_free (name);
-}
-
-void
-gtk_inspector_widget_tree_append_object (GtkInspectorWidgetTree *wt,
- GObject *object,
- GtkTreeIter *parent_iter,
- const gchar *name)
-{
- GtkTreeIter iter;
- GtkTreePath *path;
- const gchar *class_name;
- gchar *address;
- gboolean mapped;
- ObjectData *od;
- const gchar *label;
-
- if (GTK_IS_WIDGET (object))
- mapped = gtk_widget_get_mapped (GTK_WIDGET (object));
- else
- mapped = TRUE;
-
- class_name = G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (object));
-
- if (GTK_IS_WIDGET (object))
- {
- const gchar *id;
- id = gtk_widget_get_name (GTK_WIDGET (object));
- if (name == NULL && id != NULL && g_strcmp0 (id, class_name) != 0)
- name = id;
- }
-
- if (GTK_IS_BUILDABLE (object))
- {
- const gchar *id;
- id = gtk_buildable_get_name (GTK_BUILDABLE (object));
- if (name == NULL && id != NULL && !g_str_has_prefix (id, "___object_"))
- name = id;
- }
-
- if (name == NULL)
- name = "";
-
- if (GTK_IS_LABEL (object))
- label = gtk_label_get_text (GTK_LABEL (object));
- else if (GTK_IS_BUTTON (object))
- label = gtk_button_get_label (GTK_BUTTON (object));
- else if (GTK_IS_WINDOW (object))
- label = gtk_window_get_title (GTK_WINDOW (object));
- else if (GTK_IS_TREE_VIEW_COLUMN (object))
- label = gtk_tree_view_column_get_title (GTK_TREE_VIEW_COLUMN (object));
- else
- label = "";
-
- address = g_strdup_printf ("%p", object);
-
- gtk_tree_store_append (wt->priv->model, &iter, parent_iter);
- gtk_tree_store_set (wt->priv->model, &iter,
- OBJECT, object,
- OBJECT_TYPE, class_name,
- OBJECT_NAME, name,
- OBJECT_LABEL, label,
- OBJECT_ADDRESS, address,
- SENSITIVE, mapped,
- -1);
-
- od = g_new0 (ObjectData, 1);
- od->wt = wt;
- od->object = object;
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (wt->priv->model), &iter);
- od->row = gtk_tree_row_reference_new (GTK_TREE_MODEL (wt->priv->model), path);
- gtk_tree_path_free (path);
-
- g_hash_table_insert (wt->priv->iters, object, od);
- g_object_weak_ref (object, gtk_widget_tree_remove_dead_object, od);
-
- g_free (address);
-
- if (GTK_IS_CONTAINER (object))
- {
- FindAllData data;
-
- data.wt = wt;
- data.iter = &iter;
- data.parent = object;
-
- gtk_container_forall (GTK_CONTAINER (object), child_callback, &data);
- }
-
- /* Below are special cases for dependent objects which are not
- * children in the GtkContainer sense, but which we still want
- * to show in the tree right away.
- */
- if (GTK_IS_TREE_MODEL_SORT (object))
- {
- GObject *child = G_OBJECT (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (object)));
- if (child)
- gtk_inspector_widget_tree_append_object (wt, child, &iter, "model");
- }
-
- if (GTK_IS_TREE_MODEL_FILTER (object))
- {
- GObject *child = G_OBJECT (gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (object)));
- if (child)
- gtk_inspector_widget_tree_append_object (wt, child, &iter, "model");
- }
-
- if (GTK_IS_MENU_ITEM (object))
- {
- GtkWidget *submenu;
-
- submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (object));
- if (submenu)
- gtk_inspector_widget_tree_append_object (wt, G_OBJECT (submenu), &iter, "submenu");
- }
-
- if (GTK_IS_COMBO_BOX (object))
- {
- GtkWidget *popup;
- GObject *child;
-
- popup = gtk_combo_box_get_popup (GTK_COMBO_BOX (object));
- if (popup)
- gtk_inspector_widget_tree_append_object (wt, G_OBJECT (popup), &iter, "popup");
-
- child = G_OBJECT (gtk_combo_box_get_model (GTK_COMBO_BOX (object)));
- if (child)
- gtk_inspector_widget_tree_append_object (wt, child, &iter, "model");
- }
-
- if (GTK_IS_TREE_VIEW (object))
- {
- gint n_columns, i;
- GObject *child;
-
- child = G_OBJECT (gtk_tree_view_get_model (GTK_TREE_VIEW (object)));
- if (child)
- gtk_inspector_widget_tree_append_object (wt, child, &iter, "model");
-
- child = G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (object)));
- if (child)
- gtk_inspector_widget_tree_append_object (wt, child, &iter, "selection");
-
- n_columns = gtk_tree_view_get_n_columns (GTK_TREE_VIEW (object));
- for (i = 0; i < n_columns; i++)
- {
- child = G_OBJECT (gtk_tree_view_get_column (GTK_TREE_VIEW (object), i));
- gtk_inspector_widget_tree_append_object (wt, child, &iter, NULL);
- }
- }
-
- if (GTK_IS_ICON_VIEW (object))
- {
- GObject *child;
-
- child = G_OBJECT (gtk_icon_view_get_model (GTK_ICON_VIEW (object)));
- if (child)
- gtk_inspector_widget_tree_append_object (wt, child, &iter, "model");
- }
-
- if (GTK_IS_CELL_AREA (object))
- {
- FindAllData data;
-
- data.wt = wt;
- data.iter = &iter;
- data.parent = object;
-
- gtk_cell_area_foreach (GTK_CELL_AREA (object), cell_callback, &data);
- }
- else if (GTK_IS_CELL_LAYOUT (object))
- {
- GtkCellArea *area;
-
- area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (object));
- g_object_set_data (G_OBJECT (area), "gtk-inspector-cell-layout", object);
- gtk_inspector_widget_tree_append_object (wt, G_OBJECT (area), &iter, "cell-area");
- }
-
- if (GTK_IS_TEXT_VIEW (object))
- {
- GtkTextBuffer *buffer;
-
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (object));
- gtk_inspector_widget_tree_append_object (wt, G_OBJECT (buffer), &iter, "buffer");
- }
-
- if (GTK_IS_TEXT_BUFFER (object))
- {
- GtkTextTagTable *tags;
-
- tags = gtk_text_buffer_get_tag_table (GTK_TEXT_BUFFER (object));
- gtk_inspector_widget_tree_append_object (wt, G_OBJECT (tags), &iter, "tag-table");
- }
-
- if (GTK_IS_TEXT_TAG_TABLE (object))
- {
- FindAllData data;
-
- data.wt = wt;
- data.iter = &iter;
- data.parent = object;
-
- gtk_text_tag_table_foreach (GTK_TEXT_TAG_TABLE (object), tag_callback, &data);
- }
-
- if (GTK_IS_WIDGET (object))
- {
- struct {
- GtkPropagationPhase phase;
- const gchar *name;
- } phases[] = {
- { GTK_PHASE_CAPTURE, "capture" },
- { GTK_PHASE_TARGET, "target" },
- { GTK_PHASE_BUBBLE, "bubble" },
- { GTK_PHASE_NONE, "" }
- };
- gint i;
-
- for (i = 0; i < G_N_ELEMENTS (phases); i++)
- {
- GList *list, *l;
-
- list = _gtk_widget_list_controllers (GTK_WIDGET (object), phases[i].phase);
- for (l = list; l; l = l->next)
- {
- GObject *controller = l->data;
- gtk_inspector_widget_tree_append_object (wt, controller, &iter, phases[i].name);
- }
- g_list_free (list);
- }
- }
-
-}
-
-void
-gtk_inspector_widget_tree_scan (GtkInspectorWidgetTree *wt,
- GtkWidget *window)
-{
- GtkWidget *inspector_win;
- GList *toplevels, *l;
-
- gtk_tree_store_clear (wt->priv->model);
- g_hash_table_remove_all (wt->priv->iters);
- gtk_inspector_widget_tree_append_object (wt, G_OBJECT (gtk_settings_get_default ()), NULL, NULL);
- if (g_application_get_default ())
- gtk_inspector_widget_tree_append_object (wt, G_OBJECT (g_application_get_default ()), NULL, NULL);
-
- if (window)
- gtk_inspector_widget_tree_append_object (wt, G_OBJECT (window), NULL, NULL);
-
- inspector_win = gtk_widget_get_toplevel (GTK_WIDGET (wt));
- toplevels = gtk_window_list_toplevels ();
- for (l = toplevels; l; l = l->next)
- {
- if (GTK_IS_WINDOW (l->data) &&
- gtk_window_get_window_type (l->data) == GTK_WINDOW_TOPLEVEL &&
- l->data != window &&
- l->data != inspector_win)
- gtk_inspector_widget_tree_append_object (wt, G_OBJECT (l->data), NULL, NULL);
- }
- g_list_free (toplevels);
-
- gtk_tree_view_columns_autosize (GTK_TREE_VIEW (wt->priv->tree));
-}
-
-gboolean
-gtk_inspector_widget_tree_find_object (GtkInspectorWidgetTree *wt,
- GObject *object,
- GtkTreeIter *iter)
-{
- ObjectData *od;
-
- od = g_hash_table_lookup (wt->priv->iters, object);
- if (od && gtk_tree_row_reference_valid (od->row))
- {
- GtkTreePath *path;
-
- path = gtk_tree_row_reference_get_path (od->row);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (wt->priv->model), iter, path);
- gtk_tree_path_free (path);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-void
-gtk_inspector_widget_tree_select_object (GtkInspectorWidgetTree *wt,
- GObject *object)
-{
- GtkTreeIter iter;
-
- if (gtk_inspector_widget_tree_find_object (wt, object, &iter))
- {
- GtkTreePath *path = gtk_tree_model_get_path (GTK_TREE_MODEL (wt->priv->model), &iter);
- gtk_tree_view_expand_to_path (GTK_TREE_VIEW (wt->priv->tree), path);
- gtk_tree_selection_select_iter (gtk_tree_view_get_selection (GTK_TREE_VIEW (wt->priv->tree)), &iter);
- gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (wt->priv->tree), path, NULL, FALSE, 0, 0);
- }
-}
-
-
-// vim: set et sw=2 ts=2:
+++ /dev/null
-/*
- * Copyright (c) 2008-2009 Christian Hammond
- * Copyright (c) 2008-2009 David Trowbridge
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-#ifndef _GTK_INSPECTOR_WIDGET_TREE_H_
-#define _GTK_INSPECTOR_WIDGET_TREE_H_
-
-#include <gtk/gtkbox.h>
-#include <gtk/gtktreemodel.h>
-
-#define GTK_TYPE_INSPECTOR_WIDGET_TREE (gtk_inspector_widget_tree_get_type())
-#define GTK_INSPECTOR_WIDGET_TREE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_INSPECTOR_WIDGET_TREE, GtkInspectorWidgetTree))
-#define GTK_INSPECTOR_WIDGET_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_INSPECTOR_WIDGET_TREE, GtkInspectorWidgetTreeClass))
-#define GTK_INSPECTOR_IS_WIDGET_TREE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_INSPECTOR_WIDGET_TREE))
-#define GTK_INSPECTOR_IS_WIDGET_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_INSPECTOR_WIDGET_TREE))
-#define GTK_INSPECTOR_WIDGET_TREE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_INSPECTOR_WIDGET_TREE, GtkInspectorWidgetTreeClass))
-
-
-typedef struct _GtkInspectorWidgetTreePrivate GtkInspectorWidgetTreePrivate;
-
-typedef struct _GtkInspectorWidgetTree
-{
- GtkBox parent;
- GtkInspectorWidgetTreePrivate *priv;
-} GtkInspectorWidgetTree;
-
-typedef struct _GtkInspectorWidgetTreeClass
-{
- GtkBoxClass parent;
-
- void (*widget_changed) (GtkInspectorWidgetTree *wt,
- GObject *object);
-} GtkInspectorWidgetTreeClass;
-
-
-G_BEGIN_DECLS
-
-
-GType gtk_inspector_widget_tree_get_type (void);
-
-void gtk_inspector_widget_tree_scan (GtkInspectorWidgetTree *wt,
- GtkWidget *window);
-void gtk_inspector_widget_tree_select_object (GtkInspectorWidgetTree *wt,
- GObject *object);
-void gtk_inspector_widget_tree_append_object (GtkInspectorWidgetTree *wt,
- GObject *object,
- GtkTreeIter *parent_iter,
- const gchar *name);
-gboolean gtk_inspector_widget_tree_find_object (GtkInspectorWidgetTree *wt,
- GObject *object,
- GtkTreeIter *iter);
-
-G_END_DECLS
-
-
-#endif // _GTK_INSPECTOR_WIDGETTREE_H_
-
-// vim: set et sw=2 ts=2:
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<interface domain="gtk30">
- <object class="GtkTreeStore" id="model">
- <columns>
- <column type="gpointer"/>
- <column type="gchararray"/>
- <column type="gchararray"/>
- <column type="gchararray"/>
- <column type="gchararray"/>
- <column type="gboolean"/>
- </columns>
- </object>
- <template class="GtkInspectorWidgetTree" parent="GtkBox">
- <property name="visible">True</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkScrolledWindow">
- <property name="visible">True</property>
- <property name="hscrollbar-policy">automatic</property>
- <property name="vscrollbar-policy">always</property>
- <property name="shadow-type">in</property>
- <property name="width-request">250</property>
- <property name="expand">True</property>
- <child>
- <object class="GtkTreeView" id="tree">
- <property name="visible">True</property>
- <property name="model">model</property>
- <property name="enable-search">True</property>
- <property name="search-column">2</property>
- <child internal-child="selection">
- <object class="GtkTreeSelection">
- <signal name="changed" handler="on_widget_selected"/>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Object</property>
- <property name="resizable">True</property>
- <child>
- <object class="GtkCellRendererText">
- <property name="scale">0.8</property>
- </object>
- <attributes>
- <attribute name="text">1</attribute>
- <attribute name="sensitive">5</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Name</property>
- <property name="resizable">True</property>
- <child>
- <object class="GtkCellRendererText">
- <property name="scale">0.8</property>
- </object>
- <attributes>
- <attribute name="text">2</attribute>
- <attribute name="sensitive">5</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Label</property>
- <property name="resizable">True</property>
- <child>
- <object class="GtkCellRendererText">
- <property name="scale">0.8</property>
- </object>
- <attributes>
- <attribute name="text">3</attribute>
- <attribute name="sensitive">5</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Address</property>
- <property name="resizable">True</property>
- <child>
- <object class="GtkCellRendererText">
- <property name="scale">0.8</property>
- <property name="family">monospace</property>
- </object>
- <attributes>
- <attribute name="text">4</attribute>
- <attribute name="sensitive">5</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- </child>
- </template>
-</interface>
+++ /dev/null
-N_("Object");
-N_("Name");
-N_("Label");
-N_("Address");
#include "classes-list.h"
#include "css-editor.h"
#include "object-hierarchy.h"
-#include "widget-tree.h"
+#include "object-tree.h"
#include "size-groups.h"
#include "style-prop-list.h"
#include "data-list.h"
G_DEFINE_TYPE (GtkInspectorWindow, gtk_inspector_window, GTK_TYPE_WINDOW)
static void
-on_widget_tree_selection_changed (GtkInspectorWidgetTree *wt,
+on_object_tree_selection_changed (GtkInspectorObjectTree *wt,
GObject *selected,
GtkInspectorWindow *iw)
{
G_OBJECT_CLASS (gtk_inspector_window_parent_class)->constructed (object);
- gtk_inspector_widget_tree_scan (GTK_INSPECTOR_WIDGET_TREE (iw->widget_tree), NULL);
+ gtk_inspector_object_tree_scan (GTK_INSPECTOR_OBJECT_TREE (iw->object_tree), NULL);
}
static void
gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/inspector/window.ui");
gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, top_stack);
- gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, widget_tree);
+ gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, object_tree);
gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, prop_list);
gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, child_prop_list);
gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, signals_list);
gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, gestures);
gtk_widget_class_bind_template_callback (widget_class, gtk_inspector_on_inspect);
- gtk_widget_class_bind_template_callback (widget_class, on_widget_tree_selection_changed);
+ gtk_widget_class_bind_template_callback (widget_class, on_object_tree_selection_changed);
}
GtkWidget *
GtkWindow parent;
GtkWidget *top_stack;
- GtkWidget *widget_tree;
+ GtkWidget *object_tree;
GtkWidget *prop_list;
GtkWidget *child_prop_list;
GtkWidget *signals_list;
<property name="visible">True</property>
<property name="orientation">horizontal</property>
<child>
- <object class="GtkInspectorWidgetTree" id="widget_tree">
+ <object class="GtkInspectorObjectTree" id="object_tree">
<property name="visible">True</property>
- <signal name="widget-changed" handler="on_widget_tree_selection_changed"/>
+ <signal name="object-changed" handler="on_object_tree_selection_changed"/>
</object>
<packing>
<property name="resize">True</property>
<child>
<object class="GtkInspectorMiscInfo" id="misc_info">
<property name="visible">True</property>
- <property name="widget-tree">widget_tree</property>
+ <property name="object-tree">object_tree</property>
</object>
<packing>
<property name="tab_expand">True</property>
<object class="GtkInspectorPropList" id="prop_list">
<property name="visible">True</property>
<property name="child-properties">False</property>
- <property name="widget-tree">widget_tree</property>
+ <property name="object-tree">object_tree</property>
</object>
<packing>
<property name="tab_expand">True</property>
<child>
<object class="GtkInspectorPropList" id="child_prop_list">
<property name="child-properties">True</property>
- <property name="widget-tree">widget_tree</property>
+ <property name="object-tree">object_tree</property>
</object>
<packing>
<property name="tab_expand">True</property>
</child>
<child>
<object class="GtkInspectorGestures" id="gestures">
- <property name="widget-tree">widget_tree</property>
+ <property name="object-tree">object_tree</property>
</object>
</child>
<child type="tab">